/**
 * request方法调用逻辑
 * 调用这个接口时 get仅仅传递url即可，post请求需要传递url和data
 *
 * 注意这里已经有了基地址 传递的url 带上网关断言处截取的内容 比如 /yueyang/test/hello
 * 这个 /yueyang是网关断言处截取的内容，自己的自己看网关自己咋配置的
 *
 *
 * example:
 * h5浏览器端和小程序端都能使用这个例子
 * request({
 *  url: "/yueyang/test/hello",
 *  method: "GET",
 * }).then(res => {
 *  console.log(res);
 * }).catch(err => {
 *  console.log(err);
 * });
 */

//基地址请求函数 h5端运行在5173端口，需要配置跨域拦截
const getBaseUrl = () => {
  //获取当前运行平台
  const platform = uni.getSystemInfoSync().platform;
  console.log("当前运行平台:" + platform);

  //H5端判断：检查是否存在 window 对象（浏览器环境）
  //用 typeof window !== "undefined" 判断是否在浏览器环境
  //用 !uni.getSystemInfoSync().miniProgram 排除小程序环境
  const isH5 =
    typeof window !== "undefined" && !uni.getSystemInfoSync().miniProgram;
  console.log("isH5:" + isH5);

  //判断是否是h5端运行
  if (isH5) {
    //h5端 需要在vite.config.ts中配置跨域拦截 参考我的配置即可
    return "";
  }
  //其他所有端口 小程序 app端 访问8080地址
  return "http://localhost:8080";
};

//TODO这里还需要获取本地存储的token值， 测试过程中自己手填写token值
//请求头 携带token
const token =
  "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6IjYwMWJjODA0LTc4OTUtNGM4Zi05OWFhLTQ3OTg3MzUzNTZhOCIsInVzZXJuYW1lIjoiYWRtaW4ifQ.oqqDgK7RcElhj6hWG1ulMakpXrkBYCEbCpwh-ORdHfpnSxFc3NV9nw-z8vbnMiMfxf_tPo91ZQnUi969GwnSmg";
const requestHeader = {
  Authorization: token,
  //请求头中默认设置Content-Type
  "Content-Type": "application/json",
};

//默认请求参数
const defaultParams = {
  //请求超时事件10s
  timeout: 10000,
  //请求头 这里有token和Content-Type
  header: requestHeader,
  //请求方式 默认是get请求
  method: "GET",
  //请求数据
  data: {},
};

/**
 *
 * @param {Object} options 请求参数 如果不传递则使用默认参数
 */
function request(options = {}) {
  //合并 修改请求参数
  const baseUrl = getBaseUrl();
  const params = {
    ...defaultParams,
    ...options,
    //请求头合并
    header: {
      ...defaultParams.header,
      ...options.header,
    },
    url: baseUrl + options.url,
  };

  //使用Uni.request发送请求 返回Promise对象
  return new Promise((resolve, reject) => {
    uni.request({
      ...params,
      // uni.request是只要后端有请求 他就会成功
      success: (res) => {
        //判断是否真的请求成功了
        if (res.statusCode != 200) {
          return reject(res);
        }
        //请求成功
        resolve(res.data);
      },
    });
  });
}

//导出请求函数
export default request;
